#include <stdio.h>
#include <stdlib.h>
#define N 5 //定义选项的个数
/*
 author: maxiao
 date: 2023-04-11 13:47
 description: 通过函数指针来实现计算器功能
*/

void menu()
{
    printf("******************************\n");
    printf("**** 1 加法      2 减法   ****\n");
    printf("**** 3 乘法      4 除法   ****\n");
    printf("**** 0 退出               ****\n");
}

float Add(int a, int b)
{
    return a + b;
}

float Sub(int a, int b)
{
    return a - b;
}

float Mul(int a, int b)
{
    return a * b; 
}

float Div(int a, int b)
{
    return a / b;
}

// 普通方法，通过switch分支来调用特定的函数
int test1()
{
    int a, b, num;
    float r;
    do
    {
        menu();
        printf("请输入你想进行的操作序号：");
        scanf("%d", &num);
        if (num == 0){
            printf("退出程序...\n");
            break;
        }else if (num>(N-1) || num<0){
            printf("您输入的选项不合要求，请重试！\n");
        }else{
        printf("请输入两个操作整数：\n");
        scanf("%d%d", &a, &b);
            switch (num){
            case 1:
                r = Add(a, b);
                printf("%2f\n", r);
                break;
            case 2:
                r = Sub(a, b);
                printf("%2f\n", r);
                break;
            case 3:
                r = Mul(a, b);
                printf("%2f\n", r);
                break;
            case 4:
                r = Div(a, b);
                printf("%2f\n", r);
                break;
            default:
                break;
            }
        }
    }
    while(num);
    return 0;
}

int test2()
{
    int a, b, num;
    float (*p[N])(int, int) = {0, Add, Sub, Mul, Div};
    float r;
    do
    {
        menu();
        printf("Debug %d", N-1);
        printf("请输入选项：");
        scanf("%d", &num);
        if (num==0){
            printf("退出程序...\n");
        } else if( num<0 || num>(N-1) ){
            printf("输入的选项不符合要求，请重试！\n");
        } else {
            printf("请输入两个操作数：");
            scanf("%d%d", &a, &b);
            r = (*(p[num]))(a,b);
            printf("result--->%2f\n", r);
        }
    }while(num);
    return 0;
}

int main()
{
    test2();
    return 0;
}
